#include <iostream>
using namespace std;

/*
    构造函数  --> 类对象创建时调用
        语法：类名(参数列表){构造函数体}
            构造函数没有返回值类型
            构造函数的名称与类名相同
        使用：创建对象的时候，会自动调用构造函数
            构造函数不能主动调用
        如果创建类的时候没用定义构造函数，编译器会默认添加一个无参构造函数
            Cat(){};    只会帮你创建对象，分配空间
        可以定义带参构造函数和无参构造函数，函数重载
            实现创建对象的多样化
        构造函数的写法：
            1.无参构造函数
            2.带参构造函数
            3.带默认参数的构造函数  容易和无参构造函数起冲突
                写在类外，构造函数不用带默认参数
            4.带参数列表的构造函数
                Cat(string _name, int _age, float _weight):name(_name), age(_age), weight(_weight)
                将_name赋值给name，_age赋值给age，_weight赋值给weight


                
*/

class Cat
{
public:
    // 带参构造函数
    // Cat(string name, int age, float weight)
    // {
    //     cout << "带参构造函数被调用" << endl;
    //     this->name = name;
    //     this->age = age;
    //     this->weight = weight;
    // }

    // 无参构造函数
    Cat()
    {
        cout << "无参构造函数被调用" << endl;
    }

    // 带默认参数的构造函数
    // Cat(string name = "lete", int age = 8, float weight = 15.5);

    // 带参数列表的构造函数
    // Cat(string _name, int _age, float _weight):name(_name), age(_age), weight(_weight)\
    // {
    //     cout << "带参数列表的构造函数被调用" << endl;
    // };
    // 写在外面
    Cat(string _name, int _age, float _weight);

    void show()
    {
        cout << "name:" << name << endl;
        cout << "age:" << age << endl;
        cout << "weight:" << weight << endl;
    }

private:
    string name;
    int age;
    float weight;
};
// Cat::Cat(string name, int age, float weight)
// {
//     cout << "带默认参数的构造函数被调用" << endl;
//     this->name = name;
//     this->age = age;
//     this->weight = weight;
// }
Cat::Cat(string _name, int _age, float _weight):name(_name), age(_age), weight(_weight)
{
    cout << "带参数列表的构造函数被调用" << endl;
}



int main()
{
    Cat c1("Tom", 3, 5.5);
    c1.show();

    Cat *c2 = new Cat("Jerry", 2, 3.5);
    c2->show();
    delete c2;

    Cat c3;
    c3.show();
    return 0;
}